package com.czk.netty.netty.rpc.client;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/1/30 14:48
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {
    /**
     * 上下文
     */
    private ChannelHandlerContext context;
    /**
     * 返回的结果
     */
    private String result;
    /**
     * 请求参数
     */
    private String param;

    /**
     * 连接时调用此方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 其他方法后续使用
        context = ctx;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 将得到的结果传给成员变量
        result = msg.toString();
        // 唤醒等待的线程
        synchronized (this) {
            notify();
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    /**
     * 被代理对象调用，发送数据给服务器，等待被唤醒返回结果
     *
     * @return
     * @throws Exception
     */
    @Override
    public Object call() throws Exception {
        // 发送数据
        context.writeAndFlush(param);
        synchronized (this) {
            wait();
        }
        return result;
    }

    public void setParam(String param) {
        this.param = param;
    }
}
